## Contents

*   [1 Standard di Pacchettizzazione](#Standard_di_Pacchettizzazione)
    *   [1.1 Prototipo di PKGBUILD](#Prototipo_di_PKGBUILD)
    *   [1.2 Etichetta del pacchetto](#Etichetta_del_pacchetto)
    *   [1.3 Denominazione pacchetto](#Denominazione_pacchetto)
    *   [1.4 Directory](#Directory)
    *   [1.5 Compiti di Makepkg](#Compiti_di_Makepkg)
    *   [1.6 Architetture](#Architetture)
    *   [1.7 Licenses](#Licenses)
    *   [1.8 Invio di pacchetti ad AUR](#Invio_di_pacchetti_ad_AUR)
*   [2 Linee guida supplementari](#Linee_guida_supplementari)
    *   [2.1 CVS/SVN Packages](#CVS.2FSVN_Packages)
    *   [2.2 Eclipse Plugin Packages](#Eclipse_Plugin_Packages)
    *   [2.3 Gnome Packages](#Gnome_Packages)
    *   [2.4 Haskell Packages](#Haskell_Packages)
    *   [2.5 Java Packages](#Java_Packages)
    *   [2.6 Kernel Module Packages](#Kernel_Module_Packages)
    *   [2.7 Lisp Packages](#Lisp_Packages)
    *   [2.8 OCaml Packages](#OCaml_Packages)
    *   [2.9 Perl Packages](#Perl_Packages)
    *   [2.10 Python Packages](#Python_Packages)
    *   [2.11 Ruby Gem Packages](#Ruby_Gem_Packages)
    *   [2.12 Wine Packages](#Wine_Packages)

## Standard di Pacchettizzazione

**I PKGBUILD messi su AUR dagli utenti NON DEVONO riferirsi ad applicazioni già presenti nei repository ufficiali in nessuna circostanza. Eccezione a questa regola sono quei pacchetti compilati con particolari funzionalità abilitate e/o patch applicate differenti da quelle dei pacchetti ufficiali. In questi casi, la voce pkgname deve essere differente, in modo da comunicare chiaramente le differenze dai pacchetti presenti nei repo.**

Nella realizzazione di pacchetti per Arch Linux, si dovrebbe **aderire alle linee guida per la pacchettizzazione** elencate qui sotto, soprattutto se avete intenzione di caricare il vostro PKGBUILD su [AUR](/index.php/AUR "AUR"). Fare riferimento inoltre alle pagine di manuale di [PKGBUILD](https://archlinux.org/pacman/PKGBUILD.5.html) e di [makepkg](https://archlinux.org/pacman/makepkg.8.html).

#### Prototipo di PKGBUILD

```
# Maintainer: Your Name <youremail at domain dot com>

pkgname=NAME
pkgver=VERSION
pkgrel=1
pkgdesc=""
arch=('i686' 'x86_64')
url="http://ADDRESS/"
license=('GPL')
groups=()
depends=()
makedepends=()
optdepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
source=($pkgname-$pkgver.tar.gz)
noextract=()
md5sums=() #generate with 'makepkg -g'

build() {
  cd $srcdir/$pkgname-$pkgver
  ./configure --prefix=/usr
  make
}

package() {
  cd $srcdir/$pkgname-$pkgver
  make DESTDIR=$pkgdir install
}

```

Altri prototipi sono reperibili in /usr/share/pacman dai pacchetti di pacman e abs.

#### Etichetta del pacchetto

*   I pacchetti non dovrebbero **mai** essere installati in `/usr/local`
*   **Non introdurre nuove variabili** negli script di compilazione `PKGBUILD`, a meno che il pacchetto non possa essere compilato senza, dato che queste potrebbero generare dei **conflitti** con le variabili utilizzate in makepkg. Se una nuova variabile è assolutamente necessaria, **sottolineare il nome della variabile** (`_`), ad esempio: `_customvariable=` 

    AUR non può rilevare l'uso di variabili personalizzate e quindi non le può utilizzare per le sostituzioni. Lo si può osservare spesso, ad esempio in:

     `http://downloads.sourceforge.net/directxwine/$patchname.$patchver.diff.bz2` 

    Tale situazione contrasta con l'effettiva funzionalità di AUR.

*   **Evitare** l'utilizzo di `/usr/libexec/` per nulla. Usare piuttosto `/usr/lib/${pkgname}/`.
*   Il campo `packager` del file meta pacchetto può essere **personalizzato** dal compilatore del pacchetto modificando l'apposita opzione nel file `/etc/makepkg.conf`, o in alternativa sovrascriverlo creando ~/.makepkg.conf
*   Tutti i messaggi importanti dovrebbero essere visualizzati (con echo) durante l'installazione utilizzando un file **.install**. Ad esempio, se un pacchetto ha bisogno di impostazioni extra per poter funzionare, tali indicazioni dovrebbero essere incluse.
*   Qualsiasi **dipendenza opzionale** non richiesta necessariamente per eseguire il pacchetto o con funzioni generali non dovrebbe essere inclusa; l'informazione dovrebbe invece essere aggiunta all'array **optdepends**:
    ```
    optdepends=('cups: printing support'
                'sane: scanners support'
                'libgphoto2: digital cameras support'
                'alsa-lib: sound support'
                'giflib: GIF images support'
                'libjpeg: JPEG images support'
                'libpng: PNG images support')

    ```

    L'esempio precedente è stato preso dal pacchetto **wine** in <tt>extra</tt>. Le informazioni "optdepends" vengono automaticamente stampate durante l'installazione/aggiornamento perciò **non** si dovrebbe mettere questo tipo di informazioni nei file .install.

*   Quando si crea una **descrizione del pacchetto**, non includere il nome del pacchetto in modo autoreferenziale. Per esempio, "Nedit è un editor di testo per X11" potrebbe essere semplificato con "Un editor di testo per X11". Tentare anche di mantenere le descrizioni a ~80 caratteri o meno.
*   Tentare di mantenere inoltre la **lunghezza della riga** nel PKGBUILD al di sotto dei 100 caratteri.
*   Laddove possibile, **rimuovere le righe vuote** dal `PKGBUILD` (`provides`, `replaces`, ecc.)
*   È pratica comune **preservare l'ordine** dei campi `PKGBUILD` come indicato sopra. Tuttavia, questo non è obbligatorio, in quanto l'unico requisito in questo contesto è la **corretta sintassi bash**.

#### Denominazione pacchetto

*   I nomi del pacchetto devono essere composti solo da **caratteri alfanumerici**; tutte le lettere devono essere **minuscole**.
*   Le versioni del pacchetto **dovrebbero essere la stessa della versione rilasciata dall'autore**. Le versioni possono comprendere lettere, se necessario (ad esempio, la versione nmap è 2.54BETA32). **I tag della versione non dovrebbero includere trattini!**, ma solo lettere, numeri e punti.
*   Le release dei pacchetti sono **specifiche per i pacchetti Arch Linux**. Queste permettono agli utenti di distinguere le build del pacchetto nuove dalle vecchie. Quando viene rilasciata una nuova versione del pacchetto, il **conto della release parte da 1**. Poi, quando vengono eseguite correzioni ed ottimizzazioni, il pacchetto viene **rilasciato** nuovamente all'utenza di Arch Linux ed il **numero di release verrà incrementato**. Quando esce una nuova versione, il conteggio del rilascio viene azzerato a 1\. Il tag del rilascio dei pacchetti segue le **stesse limitazioni di nominazione che i tag di versione**.

#### Directory

*   **I file di configurazione** dovrebbero essere messi nella directory `/etc`. Se c'è più di un file di configurazione, è consuetudine **utilizzare una sottodirectory** in modo da mantenere `/etc` il più pulita possibile. Utilizzare `/etc/{pkgname}/`, dove `{pkgname}` è il nome del pacchetto (oppure un'alternativa valida, per esempio apache usa `/etc/httpd/`).
*   I pacchetti dovrebbero seguire queste **linee guida delle directory generali**:

| `/etc` | 

**File essenziali** di configurazione del sistema

 |
| `/usr/bin` | Applicazioni binarie |
| `/usr/sbin` | Binari di sistema |
| `/usr/lib` | Librerie |
| `/usr/include` | Header file |
| `/usr/lib/{pkg}` | Moduli, plugin, ecc. |
| `/usr/share/doc/{pkg}` | Documentazione delle applicazioni |
| `/usr/share/info` | Informazioni file di sistema |
| `/usr/share/man` | Pagine di manuale |
| `/usr/share/{pkg}` | Dati delle applicazioni |
| `/var/lib/{pkg}` | Memorizzazione applicazioni persistenti |
| `/etc/{pkg}` | File di configurazione per `{pkg}` |
| `/opt/{pkg}` | 

Pacchetti autonomi grandi, come Java, ecc.

 |

*   Il pacchetto non dovrebbe contenere le seguenti directory:
    *   /dev
    *   /home
    *   /srv
    *   /media
    *   /mnt
    *   /proc
    *   /root
    *   /selinux
    *   /sys
    *   /tmp
    *   /var/tmp

#### Compiti di [Makepkg](/index.php/Makepkg "Makepkg")

Quando si utilizza makepkg per la compilazione di un pacchetto, quello che fa automaticamente è:

1.  Verificare che i pacchetti **dependencies** e **makedepends** siano installati
2.  **Scaricare i sorgenti** dai server
3.  **Verificare l'integrità** dei file sorgente
4.  **Decomprimere** i file sorgente
5.  Eseguire tutte le operazioni necessarie di **patching**
6.  **Compilare** il software e lo installa in una directory fake root
7.  **Rimuovere** i simboli dai binari
8.  **Rimuovere** i simboli di debug dalle librerie
9.  **Comprimere** i manuali e/o le pagine info
10.  Generare il **file meta pacchetto** che è incluso in ogni pacchetto
11.  **Comprimere** la fake root nel pacchetto
12.  **Memorizzare** i file del pacchetto nella directory di destinazione configurata (cwd è quella di default)

#### Architetture

L'array <tt>arch</tt> dovrebbe contenere <tt>"i686"</tt> e/o <tt>"x86_64"</tt> a seconda di qual è l'architettura di destinazione. È inoltre possibile utilizzare <tt>"any"</tt> per i pacchetti idonei ad entrambi i tipi di architettura.

#### [Licenses](/index.php/Licenses "Licenses")

L'array della licenza è in corso di implementazione nei repo ufficiali, e **dovrebbe** essere utilizzato pure nei propri pacchetti. Specificare come segue:

*   Un pacchetto licenze è stato creato in [core] e contiene licenze comuni in /usr/share/licenses/common, ad esempio /usr/share/licenses/common/GPL. Se un pacchetto è rilasciato sotto una di queste licenze, la variabile licenze dovrà essere impostata con il nome della directory, ad esempio license=("GPL")
*   Se la licenza appropriata non è inclusa nel pacchetto licenze ufficiali, si dovranno fare diverse altre cose:
    1.  I file delle licenze dovrebbero essere inclusi in /usr/share/licenses/$pkgname/, ad esempio /usr/share/licenses/dibfoo/LICENSE. Un buon modo per farlo è tramite: `install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"` 
    2.  Se l'archivio dei sorgenti non contiene i dettagli della licenza, ma la si può ad esempio visualizzare su un sito web, copiarla in un file e inserirla. Ricordarsi anche di nominarla in modo appropriato.
    3.  Aggiungere "custom" all'array licenze. Opzionalmente, è possibile sostituire "custom" con custom:"name of license".
*   Una volta che viene utilizzata una licenza in due o più pacchetti in un repo ufficiale, incluso [community], diviene "common"
*   Le licenze MIT, BSD, zlib/libpng e Python sono casi particolari e non possono essere incluse nel pacchetto "common license". A causa della variabile della licenza, è trattata come una licenza comune (license=('BSD'), license=('MIT'), license=('ZLIB') or license=('Python')) ma per il bene del filesystem, è una licenza personalizzata, perché ognuno ha una propria linea di diritto d'autore. Ogni pacchetto licenze MIT, BSD, zlib/libpng o Python dovrebbe avere la propria licenza unica conservata in /usr/share/licenses/$pkgname/.
*   Alcuni pacchetti non possono essere oggetto di una singola licenza. In questi casi possono essere immesse più voci nell'array licenza, per esempio license=("GPL" "custom:some commercial license"). Per la maggior parte dei pacchetti queste licenze si applicano in diversi casi, invece di applicarle allo stesso tempo. Una volta che a pacman sarà aggiuntà la possibilità di filtrare i risultati in base alle licenze (in modo da poter scegliere ad esempio: "voglio solo software rilasciato sotto licenze BSD e GPL"), software rilasciati sotto licenze duplici (o multiple) saranno trattati da pacman con logica OR piuttosto che AND, in modo che pacman prenda in considerazione nell'esempio succitato tutti i software rilasciati almeno sotto una delle due licenze GPL e BSD, tralasciando tutti gli altri.
*   La (L)GPL ha molte versioni e permutazioni di tali versioni. Per il software (L)GPL, la convenzione è:
    *   (L)GPL - (L)GPLv2 od ogni versione successiva
    *   (L)GPL2 - (L)GPL2 solo
    *   (L)GPL3 - (L)GPL3 od ogni versione successiva

#### Invio di pacchetti ad AUR

Si osservino le seguenti specifiche prima di inviare qualsiasi pacchetto ad AUR:

1.  I PKGBUILD inviati **NON** devono assolutamente essere già presenti in nessuno dei repository binari ufficiali. L'unica eccezione a questa rigorosa regola può essere solo quella di pacchetti con caratteristiche o funzionalità extra, e/o con eventuali patch che li contraddistinguono da quelli ufficiali. In tali occasioni l'array pkgname dovrebbe essere diverso per specificare queste differenze. Esempio: Un PKGBUILD con uno schermo GNU inviato con la patch sidebar, potrebbe essere chiamato screen-sidebar ecc. Inoltre, l'array del PKGBUILD **provides=('screen')** dovrebbe essere utilizzato al fine di evitare conflitti con il pacchetto ufficiale.
2.  Per garantire la sicurezza dei pacchetti inviati ad AUR si prega di **verificare** di aver compilato correttamente il campo `md5sum`. L'`md5sum` può essere generato utilizzando il comando `makepkg -g`.
3.  Si prega di **aggiungere una riga di commento** nella parte superiore del file `PKGBUILD` che segue questo formato. Ricordarsi di mascherare il proprio indirizzo e-mail per evitare lo spam: `# Maintainer: Your Name <address at domain dot com>` 

    Se si sta assumendo il ruolo di manutentore di un PKGBUILD esistente, aggiungere il proprio nome in cima come descritto sopra e cambiare il titolo del precedente Maintainer a Contributor:

    ```
    # Maintainer: Your Name <address at domain dot com>
    # Contributor: Previous Name <address at domain dot com>
    ```

4.  Verificare le **dipendenze** del pacchetto (ad esempio, eseguire `ldd` su eseguibili dinamici, controllare i tool richiesti dagli script, ecc). I TU raccomandano **vivamente** l'utilizzo dell'utilità `namcap`, elaborato da [Jason Chu](https://www.archlinux.org/fellows/#jason), per analizzare lo stato dei pacchetti. `Namcap` avviserà riguardo permessi errati, dipendenze mancanti, dipendenze non richieste, ed altri errori comuni. Si può installare il pacchetto `namcap` con `pacman`. Ricordare inoltre che `namcap` può essere usato per controllare sia file pkg.tar.gz che PKGBUILD.
5.  Le **dipendenze** sono tra gli errori più comuni riguardo la pacchettizzazione. Namcap può aiutare a rilevarle, ma non è sempre infallibile. Verificare le dipendenze consultando la documentazione dei sorgenti e il sito web del programma.
6.  **Non utilizzare <tt>replaces</tt>** in un PKGBUILD a meno che il pacchetto debba essere rinominato, per esempio quando *Ethereal* diventa *Wireshark*. Se il pacchetto è una versione alternativa di un pacchetto già esistente, usare <tt>conflicts</tt> (e <tt>provides</tt> se tale pacchetto è richiesto da altri). La differenza principale è che dopo la sincronizzazione (-Sy), pacman vuole subito sostituire il pacchetto installato, per trovare un pacchetto con il "matching" <tt>replaces</tt> da qualche parte nei suoi repository; <tt>conflicts</tt> d'altra parte viene considerato solo quando ha effettivamente luogo l'installazione del pacchetto, che di solito è il comportamento desiderato, dato che è meno invasivo.
7.  Tutti i file caricati su AUR devono essere contenuti in un **file tar compresso** contenente una directory con il **`PKGBUILD`** e i **file di compilazione aggiuntivi** (patch, install, ...).
    ```
    foo/PKGBUILD
    foo/foo.install
    foo/foo_bar.diff
    foo/foo.rc.conf
    ```

    Il nome dell'archivio dovrebbe contenere il nome del pacchetto, ad esempio foo.tar.gz.

    Si può facilmente compilare un archivio contenente tutti i file richiesti utilizzando <tt>makepkg --source</tt>. Questo rinominerà un tarball <tt>$pkgname-$pkgver-$pkgrel.src.tar.gz</tt>, che può essere poi caricato su AUR.

    Il tarball **non dovrebbe** contenere nè il tarball binario creato da makepkg, né la filelist.

## Linee guida supplementari

Si raccomanda di leggere per prima cosa le linee guida descritte sopra: molti concetti importanti sono spiegati in questa pagina e non verranno ripetuti nelle seguenti guide specifiche, che sono intese come un complemento agli standard elencati in questa pagina.

#### CVS/SVN Packages

Si prega di consultare [Arch CVS & SVN PKGBUILD guidelines](/index.php/Arch_CVS_%26_SVN_PKGBUILD_guidelines "Arch CVS & SVN PKGBUILD guidelines")

#### Eclipse Plugin Packages

Si prega di consultare [Eclipse plugin package guidelines](/index.php/Eclipse_plugin_package_guidelines "Eclipse plugin package guidelines")

#### Gnome Packages

Si prega di consultare [GNOME package guidelines](/index.php/GNOME_package_guidelines "GNOME package guidelines")

#### Haskell Packages

Si prega di consultare [Haskell package guidelines](/index.php/Haskell_package_guidelines "Haskell package guidelines")

#### Java Packages

Si prega di consultare [Java package guidelines](/index.php/Java_package_guidelines "Java package guidelines")

#### Kernel Module Packages

Si prega di consultare [Kernel module package guidelines](/index.php/Kernel_module_package_guidelines "Kernel module package guidelines")

#### Lisp Packages

Si prega di consultare [Lisp package guidelines](/index.php/Lisp_package_guidelines "Lisp package guidelines")

#### OCaml Packages

Si prega di consultare [OCaml package guidelines](/index.php/OCaml_package_guidelines "OCaml package guidelines")

#### Perl Packages

Si prega di consultare [Perl package guidelines](/index.php/Perl_package_guidelines "Perl package guidelines")

#### Python Packages

Si prega di consultare [Python package guidelines](/index.php/Python_package_guidelines "Python package guidelines")

#### Ruby Gem Packages

Si prega di consultare [Ruby Gem package guidelines](/index.php/Ruby_Gem_package_guidelines "Ruby Gem package guidelines")

#### Wine Packages

Si prega di consultare [Arch wine PKGBUILD guidelines](/index.php/Arch_wine_PKGBUILD_guidelines "Arch wine PKGBUILD guidelines")